home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
015
/
proset.arc
/
PRO-SET.ASM
next >
Wrap
Assembly Source File
|
1988-03-24
|
49KB
|
2,552 lines
; ***************************************
; * Program: PRO-SET.ASM *
; * Purpose: To configure the IBM *
; * PROPRINTER to individual *
; * requirements *
; * Author: Fred Willshaw *
; * CIS 73075,321 *
; * Date: March 25, 1988 *
; * Version: 3.5 *
; ***************************************
CODE SEGMENT PARA
ORG 100H ;FOR EXE2BIN
ASSUME CS:CODE,DS:NOTHING,ES:NOTHING
PROSET: JMP START ;JUMP TO INSTALL
ACTIVE_PRINTER DW 0
ASCIIZ DB 128 DUP (0)
BUFFER DB 264 DUP (' ')
COLOR_1 DB 1FH
COLOR_2 DB 9FH
COLOR_3 DB 4FH
COLOR_4 DB 2FH
COLOR_5 DB 0AFH
COLOR_6 DB 5FH
COLOR_7 DB 0DFH
COLOR_8 DB 3FH
COLOR_REQUEST DB 'C'
COLUMN DB 0
CUR_COLOR_1 DB 0
CUR_COLOR_2 DB 0
FONTGEN_PREFIX DB 27,'=',198,4,20,33
FONTREG_PREFIX DB 27,'=',15,0,20,0,0,0
FONT_CHARACTER DB 248,160,160,142,129,1,6,1,1,14,0
FONT_CTR DW 0
FONT_TYPE DB 0
FORMS_BUFFER DB ' '
HANDLE DW 0
INSERT DB ' '
LINE DB 0
LOAD_FLAG DB '½¼-'
LOAD_MSG DB ' LOADING '
KBFLAG DB 0CH
KBOARD_VECTOR DD 0 ;OLD INT 09H ADDRESS
MONO DB 'N'
PRINTER_BASE DW 3 DUP (0)
RESET_STRING DB 24 ;EMPTY BUFFER
DB 18 ;CANCEL CONDENSED &
;SET 10 CPI
DB 27,45,0 ;CANCEL UNDERSCORE
DB 27,53,0 ;STOP AUTO LINEFEED
DB 27,55 ;SELECT CHAR SET 1
DB 27,61,0,0 ;CELAR DOWNLOAD BUFFER
DB 27,65,12 ;6 LINES TO INCH
DB 27,67,66 ;SET TO 66 LINES
DB 27,67,0,11 ;SET TO 11 INCHES
DB 27,70 ;CANCEL EMPHASIZED
DB 27,72 ;CANCEL DBL STRIKE NLQ
DB 27,73,0 ;STANDARD MODE
DB 27,79 ;CANCEL AUTO PERF
DB 27,82 ;CANCEL TABS
DB 27,84 ;CANCEL SUBSCRIPT &
;SUPERSCRIPT
DB 27,85,2 ;SET TO BIDIRECTIONAL
DB 27,87,0 ;CANCEL DOUBLE WIDE
DB 27,95,0 ;CANCEL OVERSCORE
DB 0FFH ;END OF STRING
RESIDENT DB 'R'
RETURN_ADDRESS DB 132 DUP ('_')
ROW DB 0
SAVE_CUR_COL DB 0
SAVE_CUR_END DB 0
SAVE_CUR_ROW DB 0
SAVE_CUR_START DB 0
SAVE_MODE DB 0
SAVE_MSG DB 'SAVE'
SAVE_PAGE DB 0
SAVE_SIZE DW 0
SCAN_CODE DB 19H
SCREEN_ADDRESS DW 0B800H
SCREEN_BUFFER DW 8000 DUP (0)
SOUND_STATUS DB 'Y'
TYPEWRITER_BUFF DB 5280 DUP (' ')
TYPEWRITER_MSG DB ' F1=PRINT F2=CLEAR <ESC> QUIT '
DB ' LINE 00 COL 00'
WINDOW_BUMP DW 0
WINDOW_COLOR DB 0
WINDOW_LINES DW 0
WINDOW_NUMBER DW 0
WINDOW_START DW 0
WINDOW_WIDTH DW 0
WINDOW_1 DB '╔═══IBM Proprinter Configuration Aid - Version 3.5═══╗'
DB '║ ║'
DB '║ [1] LPT1: [2] LPT2: [3] LPT3: ║'
DB '║ ║'
DB '║ [A] Set Condensed Mode [L] Format/Reset/Envelope ║'
DB '║ [B] Stop Condensed Mode [M] 1/8" Spacing ║'
DB '║ [C] Set 12 CPI [N] 7/72" Spacing ║'
DB '║ [D] Set Emphasized Mode [O] Set Normal Quality ║'
DB '║ [E] Stop Emphasized Mode [P] Set Normal Downloaded ║'
DB '║ [F] ONE Direction Print --------NLQ MODES-------- ║'
DB '║ [G] TWO Direction Print [Q] Set NLQ Normal ║'
DB '║ [H] Set Double Wide [R] Set NLQ Downloaded ║'
DB '║ [I] Stop Double Wide [S] Set NLQ Doublestrike ║'
DB '║ [J] Character Set 1 [T] Stop NLQ Doublestrike ║'
DB '║ [K] Character Set 2 [U] Font Processing ║'
DB '║ [V] Typewriter Mode ║'
DB '║ ║'
DB '║ <ESC> Quit ║'
DB '║ ║'
DB '╚═══════════Fred Willshaw Software (c) 1988══════════╝'
WINDOW_2 DB '╔═════Download Font Type═════╗'
DB '║ ║'
DB '║ Select Font File Type: ║'
DB '║ ║'
DB '║ 1 = FONTGEN Created ║'
DB '║ 2 = IBM Format as shown ║'
DB '║ in IBM Manual ║'
DB '║ 3 = Create a Character ║'
DB '║ ║'
DB '║ <ESC> Quit ║'
DB '║ ║'
DB '╚════════════════════════════╝'
WINDOW_3 DB '╔═════════Download Font File══════════╗'
DB '║ ║'
DB '║ Indicate File to Load: ║'
DB '║ ║'
DB '║ Drive: ║'
DB '║ Path (include intermediate slashes) ║'
DB '║ \__________________________________ ║'
DB '║ ║'
DB '║ File Name: ____________ ║'
DB '║ ║'
DB '║ <ESC> Quit ║'
DB '╚═════════════════════════════════════╝'
WINDOW_4 DB '╔════Format/Reset/Envelope═══╗'
DB '║ ║'
DB '║ [A] Reset Printer ║'
DB '║ [B] Set Top of Form ║'
DB '║ [C] Form Length (Inches) ║'
DB '║ [D] Form Length (Lines) ║'
DB '║ [E] Print an Envelope ║'
DB '║ ║'
DB '║ > < ║'
DB '║ ║'
DB '║ <ESC> Quit ║'
DB '╚════════════════════════════╝'
WINDOW_5 DB '╔════════════════════════════╗'
DB '║ PRINTER NOT READY - Please ║'
DB '║ correct problem and then ║'
DB '║ depress the <ESC> key. ║'
DB '╚════════════════════════════╝'
WINDOW_6 DB '╔═══════════Return Address══════════╗'
DB '║ ║'
DB '║ _________________________________ ║'
DB '║ _________________________________ ║'
DB '║ _________________________________ ║'
DB '║ _________________________________ ║'
DB '║ ║'
WINDOW_6A DB '║ <ESC> Quit ║'
DB '╚═══════════════════════════════════╝'
WINDOW_6B DB 'Return Address═'
WINDOW_6C DB 'Mailing Address'
WINDOW_6D DB 'End EACH line <ENTER>'
WINDOW_6E DB 'F1=Standard F2=Legal'
WINDOW_7 DB '╔══════════Create a Font══════════╗'
DB '║ ┌───────────┐ ║'
DB '║ │ │ Char Code = ___ ║'
DB '║ │ │ Attribute = _ ║'
DB '║ │ │ ║'
DB '║ │ │ ',24,25,26,27,' move cursor ║'
DB '║ │ │ <ENTER> On/Off ║'
DB '║ │ │ F1 = Download ║'
DB '║ │ │ F2 = Save to file ║'
DB '║ │ │ F3 = Clear ║'
DB '║ └───────────┘ ║'
DB '║ <ESC> Quit ║'
DB '╚═════════════════════════════════╝'
WINDOW_TABLE DB 'A', 02, 27,15,00
DW 0991, 1151, 0000, 0000, 0000, 0000
DB 'B', 01, 18,00,00
DW 1151, 0991, 1311, 0000, 0000, 0000
DB 'C', 02, 27,58,00
DW 1311, 0000, 0000, 0000, 0000, 0000
DB 'D', 02, 27,69,00
DW 1471, 1631, 0000, 0000, 0000, 0000
DB 'E', 02, 27,70,00
DW 1631, 1471, 0000, 0000, 0000, 0000
DB 'F', 03, 27,85,01
DW 1791, 1951, 0000, 0000, 0000, 0000
DB 'G', 03, 27,85,00
DW 1951, 1791, 0000, 0000, 0000, 0000
DB 'H', 03, 27,87,01
DW 2111, 2271, 0000, 0000, 0000, 0000
DB 'I', 03, 27,87,00
DW 2271, 2111, 0000, 0000, 0000, 0000
DB 'J', 02, 27,55,00
DW 2431, 2591, 0000, 0000, 0000, 0000
DB 'K', 02, 27,54,02
DW 2591, 2431, 0000, 0000, 0000, 0000
DB 'M', 02, 27,48,00
DW 1201, 1361, 0000, 0000, 0000, 0000
DB 'N', 02, 27,49,00
DW 1361, 1201, 0000, 0000, 0000, 0000
DB 'O', 03, 27,73,00
DW 1521, 1681, 2001, 2161, 2321, 2481
DB 'P', 03, 27,73,04
DW 1681, 1521, 2001, 2161, 2321, 2481
DB 'Q', 03, 27,73,02
DW 2001, 1521, 1681, 2161, 0000, 0000
DB 'R', 03, 27,73,06
DW 2161, 1521, 1681, 2001, 0000, 0000
DB 'S', 02, 27,71,00
DW 2321, 2481, 0000, 0000, 0000, 0000
DB 'T', 02, 27,72,00
DW 2481, 2321, 0000, 0000, 0000, 0000
DB 'Z'
KBOARD_HANDLER PROC FAR ;NEW INT 09H
STI
CLD
PUSH AX
PUSH DS
MOV AX,40H
MOV DS,AX
IN AL,60H
CMP AL,BYTE PTR CS:[SCAN_CODE] ;RIGHT KEY ?
JNE KBOARD_RETURN
MOV AL,BYTE PTR DS:[17H] ;GET KEY STATUS
AND AL,BYTE PTR CS:[KBFLAG] ;RIGHT SHIFTS ON ?
CMP AL,BYTE PTR CS:[KBFLAG]
JNE KBOARD_RETURN
IN AL,61H ;RESET KEYBOARD PORTS
MOV AH,AL
OR AL,80H
OUT 61H,AL
XCHG AH,AL
OUT 61H,AL
CLI
MOV AL,20H ;SIGNAL EOI
OUT 20H,AL
POP DS
POP AX
JMP KBOARD_MATCH
KBOARD_RETURN: POP DS ;JUMP TO OLD INTERRUPT
POP AX
JMP DWORD PTR CS:[KBOARD_VECTOR]
KBOARD_MATCH: STI ;LET INTERRUPTS BEGIN
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
PUSH DS
PUSH ES
MOV AX,CS
MOV ES,AX
MOV AX,40H ;GET LPT1-3 ADDRESSES
MOV DS,AX
LEA DI,PRINTER_BASE
MOV SI,8
MOV CX,3
REP MOVSW
MOV AX,CS
MOV DS,AX
MOV AX,PRINTER_BASE ;DEFAULT TO LPT1:
MOV ACTIVE_PRINTER,AX
MOV AH,0FH ;GET VIDEO MODE
INT 10H
MOV SAVE_PAGE,BH
MOV SAVE_MODE,AL
MOV AH,3 ;GET CURSOR LOCATION
MOV BH,SAVE_PAGE
INT 10H
MOV SAVE_CUR_ROW,DH
MOV SAVE_CUR_COL,DL
CMP SAVE_MODE,7
JNE CURSOR_OKAY
CMP CX,0607H ;VALID CURSOR MODE
JNE CURSOR_OKAY ;FOR MONOCHROME ?
MOV CX,0B0CH
CURSOR_OKAY: MOV SAVE_CUR_START,CH
MOV SAVE_CUR_END,CL
MOV AL,SAVE_MODE
CMP AL,7
JE MONO_VIDEO
CMP AH,40 ;40 COLUMN SCREEN
JNE COLOR_SCREEN
CALL BEEP
JMP KBOARD_FINISH
COLOR_SCREEN: MOV MONO,'N' ;SET AS C/G ADAPTER
CMP SAVE_MODE,8 ;SEE IF PCJR OR
;EGA ADAPTER
JL CS_005 ;IF IT IS NO V_TRACE
MOV MONO,'Y' ;WAITING
CS_005: MOV SCREEN_ADDRESS,0B800H
CMP COLOR_REQUEST,'M'
JE CS_010
MOV COLOR_1,1FH
CS_010: MOV COLOR_2,9FH
MOV SAVE_SIZE,25
CMP SAVE_MODE,4
JB SCREEN_SET
MOV SAVE_SIZE,100
JMP SCREEN_SET
MONO_VIDEO: MOV MONO,'Y' ;SET AS MONOCHROME
MOV SCREEN_ADDRESS,0B000H
MOV COLOR_1,07H
MOV COLOR_2,0F0H
MOV SAVE_SIZE,25
SCREEN_SET: MOV CX,SAVE_SIZE
MOV AX,SCREEN_ADDRESS
MOV DS,AX
MOV SI,0
LEA DI,SCREEN_BUFFER
SAVE_WINDOW: PUSH CX ;STORE CURRENT SCREEN
MOV CX,80
CALL V_TRACE
REP MOVSW
POP CX
LOOP SAVE_WINDOW
MOV AX,CS
MOV DS,AX
CMP SAVE_MODE,7 ;MUST SCREEN BE RESET
JE SCREEN_OKAY_1
CMP SAVE_MODE,4
JB SCREEN_OKAY_1
MOV AH,0 ;GRAPHICS SCREEN
MOV AL,3 ;MUST RESET
INT 10H
SCREEN_OKAY_1: MOV AX,SCREEN_ADDRESS
MOV ES,AX
MOV AX,CS
MOV DS,AX
MOV AH,2 ;MOVE CURSOR TO 0,0
MOV DH,0
MOV DL,0
MOV BH,SAVE_PAGE
INT 10H
CALL DISPLAY_WIN_1
GET_REQUEST: MOV AH,00H ;MAIN PROGRAM LOOP
INT 16H
CMP AH,01H ;ESCAPE
JNE NOT_ESCAPE
JMP LEAVE_PROGRAM
NOT_ESCAPE: CMP AL,'1' ;PRINTER CHANGE ?
JB START_CHECK
CMP AL,'3'
JA START_CHECK
CALL CHANGE_PRINTER
JMP GET_REQUEST
START_CHECK: LEA SI,WINDOW_TABLE ;CHECK VALID LETTER
CMP AL,'a'
JB CHECK_FONT
CMP AL,'z'
JA BAD_REQUEST
SUB AL,' '
CHECK_FONT: CMP AL,'U' ;FONT DOWNLOAD REQUEST
JNE CHECK_FORMAT
JMP FONT_REQUEST
CHECK_FORMAT: CMP AL,'L' ;PAGE FORMAT/RESET
JNE CHECK_TWRITER
CALL PAGE_FORMAT
JMP GET_REQUEST
CHECK_TWRITER: CMP AL,'V' ;TYPEWRITER MODE
JNE CHECK_LETTER
CALL TYPEWRITER
JMP GET_REQUEST
CHECK_LETTER: CMP AL,'A' ;VALID TABLE LETTER ?
JB BAD_REQUEST
CMP AL,'T'
JA BAD_REQUEST
CHECK_TABLE: MOV DL,DS:[SI] ;MATCH TABLE
CMP DL,'Z'
JNE NOT_TABLE_END
BAD_REQUEST: CALL BEEP ;LETTER NOT FOUND
JMP GET_REQUEST
NOT_TABLE_END: CMP AL,DL ;IS IT A MATCH ?
JNE TABLE_NO_MATCH
MOV CH,0 ;YES - SEND STRING
MOV CL,BYTE PTR DS:[SI+1]
ADD SI,2
CALL SEND_PRINTER
JMP GET_REQUEST
TABLE_NO_MATCH: ADD SI,17 ;NO - LOOK SOMEMORE
JMP CHECK_TABLE
LEAVE_PROGRAM: MOV AX,CS ;ALL DONE - RESET
MOV DS,AX ;PATH AND CURSOR
CMP SAVE_MODE,7
JE SCREEN_OKAY_2
CMP SAVE_MODE,4
JB SCREEN_OKAY_2
MOV AH,0
MOV AL,SAVE_MODE
INT 10H
SCREEN_OKAY_2: MOV AH,5 ;RESTORE PAGE #
MOV AL,SAVE_PAGE
INT 10H
MOV AH,2 ;RESTORE CURSOR
MOV DH,SAVE_CUR_ROW
MOV DL,SAVE_CUR_COL
MOV BH,SAVE_PAGE
INT 10H
MOV AH,1 ;RESTORE CURSOR PARM
MOV CH,SAVE_CUR_START
MOV CL,SAVE_CUR_END
INT 10H
MOV AX,SCREEN_ADDRESS
MOV ES,AX
LEA SI,SCREEN_BUFFER
MOV DI,0
MOV CX,SAVE_SIZE
SCREEN_RESTORE: PUSH CX ;RELOAD OLD SCREEN
MOV CX,80
CALL V_TRACE
REP MOVSW
POP CX
LOOP SCREEN_RESTORE
KBOARD_FINISH: POP ES
POP DS
POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
CMP BYTE PTR CS:[RESIDENT],'R'
JE DO_IRET
RET ;BACK TO DOS
DO_IRET: IRET ;BACK TO CALLER
KBOARD_HANDLER ENDP
BACKSPACE PROC NEAR
DEC DI ;MOVE BACK 1 POS
DEC DI
MOV AL,'_'
MOV ES:[DI],AL ;BLANK IT
MOV AH,CUR_COLOR_1
MOV ES:[DI+3],AH ;REMOVE FLASH
MOV AH,CUR_COLOR_2
MOV ES:[DI+1],AH ;SET FLASH
DEC CX ;CHANGE CHAR COUNT
DEC SI
MOV AL,' '
MOV DS:[SI],AL ;BLANK MEMORY NAME
RET
BACKSPACE ENDP
BEEP PROC NEAR
CMP SOUND_STATUS,'N'
JE BP_020
PUSH AX
PUSH CX
PUSH DX
MOV DX,300
IN AL,61H
AND AL,0FEH
BP_005: OR AL,2
OUT 61H,AL
MOV CX,233
BP_010: LOOP BP_010
AND AL,0FDH
OUT 61H,AL
MOV CX,233
BP_015: LOOP BP_015
DEC DX
JNZ BP_005
POP DX
POP CX
POP AX
BP_020: RET
BEEP ENDP
CURSOR_ON PROC NEAR
CMP COLUMN,11
JL CO_005
MOV COLUMN,0
INC ROW
CO_005: CMP ROW,8
JL CO_010
MOV ROW,0
CO_010: CMP COLUMN,-1
JG CO_015
DEC ROW
MOV COLUMN,10
CO_015: CMP ROW,-1
JG CO_020
MOV ROW,7
CO_020: MOV AH,2
MOV DH,ROW
ADD DH,7
MOV DL,COLUMN
ADD DL,27
MOV BH,0
INT 10H
RET
CURSOR_ON ENDP
CHANGE_PRINTER PROC NEAR
SUB AL,'1'
PUSH AX
PUSH AX
MOV AH,0
MOV DX,AX
CP_005: MOV AH,02H
INT 17H
TEST AH,00101001B ;PRINTER AVAILABLE ?
JZ CP_010 ;YES
CALL BEEP ;NO
MOV WINDOW_BUMP,100
MOV AL,COLOR_8
MOV WINDOW_COLOR,AL
MOV WINDOW_LINES,5
MOV AX,OFFSET WINDOW_5 ;PRINTER NOT READY
MOV WINDOW_NUMBER,AX
MOV WINDOW_START,1332
MOV WINDOW_WIDTH,30
CALL DISPLAY_WINDOW
MOV AH,0
INT 16H
PUSH AX
CALL DISPLAY_WIN_1
POP AX
CMP AH,01H
JNE CP_005
POP AX
POP AX
RET
CP_010: POP AX
MOV AH,0 ;GET PRINTER ADDRESS
MOV DL,2
MUL DL
MOV BX,OFFSET PRINTER_BASE
ADD BX,AX
MOV AX,[BX]
MOV ACTIVE_PRINTER,AX
MOV AH,COLOR_1
CALL V_TRACE
MOV BYTE PTR ES:[685],AH
MOV BYTE PTR ES:[711],AH
MOV BYTE PTR ES:[737],AH
POP AX
MOV DI,685
CMP AL,1
JB CP_015
MOV DI,711
CMP AL,2
JB CP_015
MOV DI,737
CP_015: MOV AL,COLOR_2
CALL V_TRACE
MOV BYTE PTR ES:[DI],AL
RET
CHANGE_PRINTER ENDP
DISPLAY_WINDOW PROC NEAR
MOV AX,SCREEN_ADDRESS
MOV ES,AX
MOV BX,WINDOW_NUMBER
MOV DI,WINDOW_START
MOV AH,WINDOW_COLOR
MOV CX,WINDOW_LINES
DW_005: PUSH CX
MOV CX,WINDOW_WIDTH
CALL V_TRACE
DW_010: MOV AL,DS:[BX]
MOV ES:[DI],AL
INC BX
INC DI
MOV ES:[DI],AH
INC DI
LOOP DW_010
POP CX
ADD DI,WINDOW_BUMP
LOOP DW_005
RET
DISPLAY_WINDOW ENDP
DISPLAY_WIN_1 PROC NEAR
MOV WINDOW_BUMP,52 ;SHOW PRIMARY MENU
MOV AL,COLOR_1
MOV WINDOW_COLOR,AL
MOV WINDOW_LINES,20
MOV AX,OFFSET WINDOW_1
MOV WINDOW_NUMBER,AX
MOV WINDOW_START,344
MOV WINDOW_WIDTH,54
CALL DISPLAY_WINDOW
RET
DISPLAY_WIN_1 ENDP
ENVELOPE PROC NEAR
PUSH ES
PUSH DS
PUSH SI
PUSH DI
MOV AX,CS
MOV DS,AX
MOV AX,SCREEN_ADDRESS
MOV ES,AX
EN_005: MOV AH,0
INT 16H
CMP AL,0 ;INVALID CHARACTER
JE EN_015
CMP AL,27 ;ESCAPE
JNE EN_010
POP DI
POP SI
JMP EN_035
EN_010: CMP AL,08H ;BACKSPACE
JNE EN_020
CMP CX,0 ;ALREADY AT POS 1
JE EN_015
CALL BACKSPACE
JMP EN_005
EN_015: CALL BEEP
JMP EN_005
EN_020: CMP AL,0DH ;ENTER
JNE EN_025
MOV AL,CUR_COLOR_1
CALL V_TRACE
MOV BYTE PTR ES:[DI+1],AL
POP DI
POP SI
MOV AH,0
CMP LINE,4
JE EN_035
ADD DI,160
ADD SI,33
MOV AL,CUR_COLOR_2
CALL V_TRACE
MOV BYTE PTR ES:[DI+1],AL
PUSH SI
PUSH DI
MOV CX,0
INC LINE
JMP EN_005
EN_025: CMP CX,33
JB EN_030
JMP EN_015
EN_030: CALL V_TRACE
MOV BYTE PTR ES:[DI],AL ;SAVE/DISPLAY CHAR
MOV BYTE PTR DS:[SI],AL
MOV AL,CUR_COLOR_1
MOV BYTE PTR ES:[DI+1],AL
ADD DI,2
MOV AL,CUR_COLOR_2
MOV BYTE PTR ES:[DI+1],AL
INC SI
INC CX
JMP EN_005
EN_035: POP DS
POP ES
RET
ENVELOPE ENDP
FONT_REQUEST PROC NEAR
MOV AX,CS
MOV DS,AX
MOV ES,AX
LEA DI,ASCIIZ ;BLANK SEARCH HANDLE
MOV AL,00H
MOV CX,128
REP STOSB
MOV WINDOW_BUMP,100
MOV AL,COLOR_3
MOV WINDOW_COLOR,AL
MOV WINDOW_LINES,12
LEA SI,WINDOW_2
MOV WINDOW_NUMBER,SI
MOV WINDOW_START,516
MOV WINDOW_WIDTH,30
CALL DISPLAY_WINDOW
FR_005: MOV AX,CS
MOV DS,AX
MOV AH,0
INT 16H
CMP AH,01H ;ESCAPE
JNE FR_010
JMP FR_070
FR_010: CMP AL,'1' ;FONTGEN CREATED
JE FR_020
CMP AL,'2' ;IBM STANDARD
JE FR_020
CMP AL,'3' ;CREATE A CHARACTER
JNE FR_015
JMP FR_075
FR_015: CALL BEEP ;ERROR
JMP FR_005
FR_020: MOV FONT_TYPE,AL
PUSH ES
MOV AX,CS
MOV ES,AX
LEA SI,LOAD_MSG+2
LEA DI,WINDOW_3+103
MOV CX,4
REP MOVSB
POP ES
CALL GET_DSN
CMP AH,0
JE FR_025
JMP FR_070
FR_025: MOV AX,CS
MOV DS,AX
MOV ES,AX
MOV AH,3DH ;OPEN FONT FILE
MOV AL,00H
LEA DX,ASCIIZ
CLC
INT 21H
JNC FR_030
JMP FR_065
FR_030: MOV HANDLE,AX ;SAVE HANDLE
FR_035: MOV AX,SCREEN_ADDRESS
MOV ES,AX
LEA SI,LOAD_MSG ;SHOW LOADING
MOV DI,2478
MOV CX,10
MOV AH,COLOR_2
CALL V_TRACE
FR_040: MOV AL,DS:[SI]
MOV ES:[DI],AL
MOV ES:[DI+1],AH
INC SI
INC DI
INC DI
LOOP FR_040
MOV AX,CS
MOV ES,AX
CMP FONT_TYPE,'2' ;IS IT IBM FORMAT ?
JE FR_050
LEA SI,FONTGEN_PREFIX ;SEND PREFIX
MOV CX,6
FR_045: MOV AL,DS:[SI]
CALL PRINTER_PORT
INC SI
LOOP FR_045
FR_050: MOV FONT_CTR,11 ;COUNTER FOR FONTGEN
FR_055: CMP FONT_TYPE,'2' ;IBM FORMAT ?
JE FR_060
INC FONT_CTR
CMP FONT_CTR,12
JB FR_060
MOV AL,0
CALL PRINTER_PORT
MOV FONT_CTR,0
FR_060: MOV CX,1 ;READ FONT FILE
MOV BX,HANDLE
LEA DX,BUFFER
MOV AH,3FH
INT 21H
CMP AX,0
JE FR_070
MOV SI,DX
MOV AL,BYTE PTR DS:[SI]
CALL PRINTER_PORT
JMP FR_055
FR_065: CALL BEEP
JMP FONT_REQUEST
FR_070: MOV AH,3EH ;CLOSE FONT FILE
INT 21H
MOV AX,CS
MOV DS,AX
CALL DISPLAY_WIN_1
JMP GET_REQUEST
FR_075: MOV WINDOW_BUMP,90
MOV AL,COLOR_6
MOV WINDOW_COLOR,AL
MOV WINDOW_LINES,13
LEA SI,WINDOW_7
MOV WINDOW_NUMBER,SI
MOV WINDOW_START,848
MOV WINDOW_WIDTH,35
CALL DISPLAY_WINDOW
LEA SI,FONT_CHARACTER
MOV DI,1174
MOV CX,11
FR_080: PUSH CX
PUSH DI
MOV BL,10000000B
MOV CX,8
CALL V_TRACE
FR_085: MOV AL,BYTE PTR DS:[SI]
AND AL,BL
CMP AL,BL
JNE FR_090
MOV AL,9
MOV BYTE PTR ES:[DI],AL
FR_090: SHR BL,1
ADD DI,160
LOOP FR_085
POP DI
POP CX
ADD DI,2
INC SI
LOOP FR_080
FR_095: MOV AL,'_'
MOV AH,COLOR_7
CALL V_TRACE
MOV BYTE PTR ES:[1224],AL
MOV BYTE PTR ES:[1226],AL
MOV BYTE PTR ES:[1228],AL
MOV BYTE PTR ES:[1225],AH
MOV DI,1224
MOV SI,OFFSET FORMS_BUFFER
MOV CX,0
FR_100: MOV AH,0
INT 16H
CMP AL,08H
JNE FR_105
CMP CX,0
JE FR_120
MOV AL,COLOR_6
MOV CUR_COLOR_1,AL
MOV AL,COLOR_7
MOV CUR_COLOR_2,AL
CALL BACKSPACE
JMP FR_100
FR_105: CMP AH,01H
JNE FR_110
JMP FR_235
FR_110: CMP AL,0DH
JNE FR_115
JMP FR_135
FR_115: CMP AL,'0'
JB FR_120
CMP AL,'9'
JA FR_120
JMP FR_130
FR_120: CMP AH,3DH
JNE FR_125
JMP FR_280
FR_125: CALL BEEP
JMP FR_100
FR_130: MOV AH,COLOR_6
CALL V_TRACE
MOV BYTE PTR ES:[DI],AL
MOV BYTE PTR DS:[SI],AL
MOV BYTE PTR ES:[DI+1],AH
ADD DI,2
INC SI
INC CX
CMP CX,3
JE FR_135
JMP FR_100
FR_135: MOV AX,0
MOV SI,OFFSET FORMS_BUFFER
CMP CX,3
JB FR_140
MOV DL,100
MOV AL,CS:[SI]
SUB AL,'0'
MUL DL
INC SI
FR_140: PUSH AX
CMP CX,2
JB FR_145
MOV DL,10
MOV AL,CS:[SI]
SUB AL,'0'
MUL DL
XCHG AX,BX
POP AX
ADD AX,BX
PUSH AX
INC SI
FR_145: POP AX
MOV BH,0
MOV BL,CS:[SI]
SUB BL,'0'
ADD AX,BX
CMP AX,127
JB FR_150
CALL BEEP
JMP FR_095
FR_150: CMP AX,32
JA FR_155
CALL BEEP
JMP FR_095
FR_155: LEA SI,FONTREG_PREFIX+5
MOV BYTE PTR DS:[SI],AL
MOV AH,COLOR_7
CALL V_TRACE
MOV BYTE PTR ES:[1385],AH
MOV AH,0
INT 16H
CMP AL,'0'
JE FR_165
CMP AL,'1'
JE FR_165
CMP AH,01H
JNE FR_160
JMP FR_235
FR_160: CALL BEEP
JMP FR_155
FR_165: MOV AH,COLOR_6
CALL V_TRACE
MOV BYTE PTR ES:[1384],AL
MOV BYTE PTR ES:[1385],AH
SUB AL,'0'
CMP AL,0
JE FR_167
MOV AL,128
FR_167: LEA SI,FONTREG_PREFIX+6
MOV BYTE PTR DS:[SI],AL
MOV COLUMN,0
MOV ROW,0
CALL CURSOR_ON
FR_170: MOV AH,0
INT 16H
CMP AH,01H ;ESCAPE
JNE FR_175
JMP FR_230
FR_175: CMP AH,4DH ;RIGHT ARROW
JE FR_195
CMP AH,4BH ;LEFT ARROW
JE FR_200
CMP AH,48H ;UP ARROW
JE FR_205
CMP AH,50H ;DOWN ARROW
JE FR_210
CMP AL,0DH ;ENTER
JE FR_215
CMP AH,3CH ;SAVE
JNE FR_180
JMP FR_240
FR_180: CMP AH,3BH ;DOWNLOAD
JNE FR_185
JMP FR_265
FR_185: CMP AH,3DH ;CLEAR
JNE FR_190
JMP FR_280
FR_190: CALL BEEP
JMP FR_170
FR_195: INC COLUMN
CALL CURSOR_ON
JMP FR_170
FR_200: DEC COLUMN
CALL CURSOR_ON
JMP FR_170
FR_205: DEC ROW
CALL CURSOR_ON
JMP FR_170
FR_210: INC ROW
CALL CURSOR_ON
JMP FR_170
FR_215: MOV AH,0
MOV AL,COLUMN
SHL AL,1
MOV DI,1174
ADD DI,AX
MOV AL,ROW
MOV DL,160
MUL DL
ADD DI,AX
CMP BYTE PTR ES:[DI],9 ;OFF
JE FR_220
MOV AL,9
CALL V_TRACE
MOV BYTE PTR ES:[DI],AL
JMP FR_225
FR_220: MOV AL,32 ;ON
CALL V_TRACE
MOV BYTE PTR ES:[DI],AL
FR_225: INC COLUMN
CALL CURSOR_ON
JMP FR_170
FR_230: CALL SAVE_FONT
FR_235: MOV AH,2
MOV DH,0
MOV DL,0
MOV BH,0
INT 10H
CALL DISPLAY_WIN_1
JMP GET_REQUEST
FR_240: CALL SAVE_FONT
MOV AH,2
MOV DH,0
MOV DL,0
MOV BH,0
INT 10H
PUSH ES
MOV AX,CS
MOV ES,AX
LEA SI,SAVE_MSG
LEA DI,WINDOW_3+103
MOV CX,4
REP MOVSB
LEA DI,ASCIIZ
MOV AL,00H
MOV CX,128
REP STOSB
POP ES
CALL GET_DSN
CMP AH,0
JE FR_245
JMP FR_075
FR_245: MOV AX,CS
MOV DS,AX
MOV ES,AX
MOV AH,3DH ;OPEN FONT FILE
MOV AL,01H
LEA DX,ASCIIZ
CLC
INT 21H
JC FR_250 ;NOT FOUND
JMP FR_255
FR_250: MOV AH,3CH ;CREATE NEW FILE
MOV CX,0
LEA DX,ASCIIZ
CLC
INT 21H
JNC FR_255
JMP FR_260
FR_255: MOV HANDLE,AX
MOV BX,AX
MOV AH,42H ;SET TO EOF
MOV CX,0
MOV DX,0
MOV AL,2
INT 21H
MOV BX,HANDLE
MOV AH,40H ;WRITE IT
MOV CX,19
LEA DX,FONTREG_PREFIX
INT 21H
MOV AH,3EH ;CLOSE
MOV BX,HANDLE
INT 21H
JMP FR_075
FR_260: CALL BEEP ;ERROR
JMP FR_075
FR_265: CALL SAVE_FONT
MOV AH,2
MOV DH,0
MOV DL,0
MOV BH,0
INT 10H
LEA SI,FONTREG_PREFIX
MOV CX,8
FR_270: MOV AL,DS:[SI]
CALL PRINTER_PORT
INC SI
LOOP FR_270
LEA SI,FONT_CHARACTER
MOV CX,11
FR_275: MOV AL,DS:[SI]
CALL PRINTER_PORT
INC SI
LOOP FR_275
JMP FR_075
FR_280: LEA BX,FONT_CHARACTER ;CLEAR PIN MAP
MOV AL,00H
MOV CX,11
FR_285: MOV DS:[BX],AL
INC BX
LOOP FR_285
JMP FR_075
FONT_REQUEST ENDP
GET_DSN PROC NEAR
MOV WINDOW_BUMP,82
MOV AL,COLOR_4
MOV WINDOW_COLOR,AL
MOV WINDOW_LINES,12
LEA SI,WINDOW_3
MOV WINDOW_NUMBER,SI
MOV WINDOW_START,848
MOV WINDOW_WIDTH,39
CALL DISPLAY_WINDOW
GD_005: MOV AH,0 ;GET DRIVE
INT 16H
CMP AH,01H ;ESCAPE
JNE GD_010
RET
GD_010: CMP AL,'a'
JB GD_015
CMP AL,'z'
JA GD_015
SUB AL,' '
GD_015: CMP AL,'A'
JB GD_020
CMP AL,'Z'
JA GD_020
LEA SI,ASCIIZ
MOV BYTE PTR DS:[SI],AL
MOV BYTE PTR ES:[1506],AL
MOV AH,COLOR_4
MOV BYTE PTR ES:[1507],AH
JMP GD_025
GD_020: CALL BEEP
JMP GD_005
GD_025: MOV AL,':'
MOV BYTE PTR DS:[SI+1],AL
MOV AL,'\'
MOV BYTE PTR DS:[SI+2],AL
ADD SI,3
MOV AH,COLOR_5 ;GET NEW PATH
MOV BYTE PTR ES:[1815],AH
MOV DI,1814
MOV CX,0
GD_030: MOV AH,0
INT 16H
CMP AH,01H ;ESCAPE
JNE GD_035
RET
GD_035: CMP AL,08H ;BACKSPACE
JNE GD_045
CMP CX,0 ;ALREADY AT POS 1
JE GD_040
MOV AL,COLOR_4
MOV CUR_COLOR_1,AL
MOV AL,COLOR_5
MOV CUR_COLOR_2,AL
CALL BACKSPACE
JMP GD_030
GD_040: CALL BEEP
JMP GD_030
GD_045: CMP AL,0DH ;ENTER
JE GD_060
CMP AL,' ' ;SPACE
JNE GD_050
MOV AL,0
GD_050: CMP AL,'a'
JB GD_055
CMP AL,'z'
JA GD_050
SUB AL,' '
GD_055: MOV ES:[DI],AL
MOV DS:[SI],AL
MOV AH,COLOR_4
INC DI
MOV ES:[DI],AH
MOV AH,COLOR_5
MOV ES:[DI+2],AH
INC DI
INC SI
INC CX
CMP CX,34
JE GD_060
JMP GD_030
GD_060: MOV AH,COLOR_4
MOV ES:[DI+1],AH
CMP BYTE PTR DS:[SI-1],'\'
JE GD_065
MOV AL,'\'
MOV DS:[SI],AL
INC SI
GD_065: MOV DI,2154 ;GET DSN
MOV CX,0
MOV AH,COLOR_5
MOV ES:[DI+1],AH
GD_070: MOV AH,0
INT 16H
CMP AH,01H ;ESCAPE
JNE GD_075
RET
GD_075: CMP AL,08H ;BACKSPACE
JNE GD_085
CMP CX,0 ;AT POSITION 1
JE GD_080
MOV AL,COLOR_4
MOV CUR_COLOR_1,AL
MOV AL,COLOR_5
MOV CUR_COLOR_2,AL
CALL BACKSPACE
JMP GD_070
GD_080: CALL BEEP
JMP GD_070
GD_085: CMP AL,0DH ;ENTER
JNE GD_090
MOV AH,00H
RET
GD_090: CMP AL,'a'
JB GD_095
CMP AL,'z'
JA GD_095
SUB AL,' '
GD_095: CMP CX,12
JE GD_105
INC CX
MOV DS:[SI],AL
INC SI
GD_100: MOV ES:[DI],AL
INC DI
MOV AH,COLOR_4
MOV ES:[DI],AH
JE GD_105
MOV AH,COLOR_5
MOV ES:[DI+2],AH
INC DI
JMP GD_070
GD_105: CALL BEEP
JMP GD_070
GET_DSN ENDP
PAGE_FORMAT PROC NEAR
MOV WINDOW_BUMP,100
MOV AL,COLOR_6
MOV WINDOW_COLOR,AL
MOV WINDOW_LINES,12
MOV AX,OFFSET WINDOW_4
MOV WINDOW_NUMBER,AX
MOV WINDOW_START,1180
MOV WINDOW_WIDTH,30
CALL DISPLAY_WINDOW
PF_005: MOV AH,0
INT 16H
CMP AH,01H ;ESCAPE
JNE PF_010
CALL DISPLAY_WIN_1
RET
PF_010: CMP AL,'a'
JB PF_015
CMP AL,'z'
JA PF_015
SUB AL,' '
PF_015: CMP AL,'A' ;RESET PRINTER REQUEST
JNE PF_030
MOV AH,COLOR_7
CALL V_TRACE
MOV BYTE PTR ES:[1507],AH
LEA SI,RESET_STRING
PF_020: MOV AL,BYTE PTR CS:[SI]
CMP AL,0FFH
JE PF_025
CALL PRINTER_PORT
INC SI
JMP SHORT PF_020
PF_025: JMP PF_005
PF_030: CMP AL,'B' ;TOP OF FORM REQUEST
JNE PF_035
MOV AH,COLOR_7
CALL V_TRACE
MOV BYTE PTR ES:[1667],AH
MOV AL,27
CALL PRINTER_PORT
MOV AL,4
CALL PRINTER_PORT
JMP PF_005
PF_035: MOV FONT_TYPE,AL ;SAVE REQUEST TYPE
CMP AL,'C' ;FORM LENGTH IN INCHES
JE PF_040
JMP PF_115
PF_040: MOV AL,'_'
MOV AH,COLOR_7
CALL V_TRACE
MOV BYTE PTR ES:[2486],AL
MOV BYTE PTR ES:[2488],AL
MOV BYTE PTR ES:[2490],AL
MOV DI,1827
CMP FONT_TYPE,'C'
JE PF_045
MOV DI,1987
PF_045: MOV BYTE PTR ES:[DI],AH
MOV BYTE PTR ES:[2487],AH
MOV DI,2486
MOV SI,OFFSET FORMS_BUFFER
MOV CX,0
PF_050: MOV AH,0
INT 16H
CMP AL,08H
JNE PF_055
CMP CX,0
JE PF_070
MOV AL,COLOR_6
MOV CUR_COLOR_1,AL
MOV AL,COLOR_7
MOV CUR_COLOR_2,AL
CALL BACKSPACE
JMP PF_050
PF_055: CMP AH,01H
JNE PF_060
MOV AL,' '
CALL V_TRACE
MOV BYTE PTR ES:[2486],AL
MOV BYTE PTR ES:[2488],AL
MOV BYTE PTR ES:[2490],AL
MOV AL,0
MOV FORMS_BUFFER[0],AL
MOV FORMS_BUFFER[1],AL
MOV FORMS_BUFFER[2],AL
JMP PF_005
PF_060: CMP AL,0DH
JNE PF_065
JMP PF_080
PF_065: CMP AL,'0'
JB PF_070
CMP AL,'9'
JA PF_070
JMP PF_075
PF_070: CALL BEEP
JMP PF_050
PF_075: CALL V_TRACE
MOV BYTE PTR ES:[DI],AL
MOV BYTE PTR DS:[SI],AL
ADD DI,2
INC SI
INC CX
CMP CX,3
JE PF_080
JMP PF_050
PF_080: MOV AX,0
MOV SI,OFFSET FORMS_BUFFER
CMP CX,3
JB PF_085
MOV DL,100
MOV AL,CS:[SI]
SUB AL,'0'
MUL DL
INC SI
PF_085: PUSH AX
CMP CX,2
JB PF_090
MOV DL,10
MOV AL,CS:[SI]
SUB AL,'0'
MUL DL
XCHG AX,BX
POP AX
ADD AX,BX
PUSH AX
INC SI
PF_090: POP AX
MOV BH,0
MOV BL,CS:[SI]
SUB BL,'0'
ADD AX,BX
CMP AX,256
JB PF_100
CALL BEEP
MOV AH,COLOR_6
MOV DI,1827
CMP FONT_TYPE,'C'
JE PF_095
MOV DI,1987
PF_095: CALL V_TRACE
MOV BYTE PTR ES:[DI],AH
JMP PF_110
PF_100: XCHG AX,BX
MOV AL,27
CALL PRINTER_PORT
MOV AL,'C'
CALL PRINTER_PORT
CMP FONT_TYPE,'D'
JE PF_105
MOV AL,0
CALL PRINTER_PORT
PF_105: XCHG AX,BX
CALL PRINTER_PORT
PF_110: MOV AL,' '
MOV AH,COLOR_6
CALL V_TRACE
MOV BYTE PTR ES:[2486],AL
MOV BYTE PTR ES:[2487],AH
MOV BYTE PTR ES:[2488],AL
MOV BYTE PTR ES:[2489],AH
MOV BYTE PTR ES:[2490],AL
MOV BYTE PTR ES:[2491],AH
JMP PF_005
PF_115: CMP AL,'D' ;FORM LENGTH IN LINES
JNE PF_120
JMP PF_040
PF_120: CMP AL,'E'
JE PF_125
CALL BEEP
JMP PF_005
PF_125: MOV AX,CS ;FILL RETURN ADDRESS
MOV ES,AX
MOV CX,4
LEA SI,RETURN_ADDRESS
MOV DI,OFFSET WINDOW_6 + 76
PF_130: PUSH CX
MOV CX,33
REP MOVSB
ADD DI,4
POP CX
LOOP PF_130
MOV DI,OFFSET WINDOW_6+108 ;PUT _ IN ADDRESS
MOV CX,4
PF_135: PUSH DI
PUSH CX
MOV CX,33
PF_140: MOV AL,BYTE PTR ES:[DI]
CMP AL,00H
JE PF_145
CMP AL,' '
JNE PF_150
PF_145: MOV AL,5FH
MOV BYTE PTR ES:[DI],AL
DEC DI
LOOP PF_140
PF_150: POP CX
POP DI
ADD DI,37
LOOP PF_135
LEA DI,BUFFER ;CLEAR WORK BUFFER
LEA SI,RETURN_ADDRESS
MOV CX,132
PF_155: MOV AL,DS:[SI]
CMP AL,'_'
JNE PF_160
MOV AL,' '
PF_160: MOV ES:[DI],AL
INC DI
INC SI
LOOP PF_155
MOV AL,' ' ;BLANK MAILING ADDRESS
MOV CX,132
REP STOSB
LEA SI,WINDOW_6B ;RETURN ADDRESS INPUT
LEA DI,WINDOW_6+12
MOV CX,15
REP MOVSB
LEA SI,WINDOW_6D
LEA DI,WINDOW_6A+2
MOV CX,21
REP MOVSB
MOV WINDOW_BUMP,86
MOV AL,COLOR_3
MOV WINDOW_COLOR,AL
MOV WINDOW_LINES,9
MOV AX,OFFSET WINDOW_6
MOV WINDOW_NUMBER,AX
MOV WINDOW_START,668
MOV WINDOW_WIDTH,37
CALL DISPLAY_WINDOW
MOV AL,COLOR_3
MOV CUR_COLOR_1,AL
MOV CUR_COLOR_2,0F4H
LEA SI,BUFFER
MOV DI,992
MOV CX,0
MOV LINE,1
CALL V_TRACE
MOV AL,CUR_COLOR_2
MOV BYTE PTR ES:[DI+1],AL
CALL ENVELOPE
CMP AH,01H
JNE PF_165
JMP PF_265
PF_165: MOV AX,CS
MOV ES,AX
LEA SI,BUFFER ;SAVE RETURN
LEA DI,RETURN_ADDRESS
MOV CX,4
PF_170: PUSH CX
PUSH DI
PUSH SI
MOV CX,33
PF_175: CMP BYTE PTR DS:[SI],' '
JNE PF_180
INC SI
LOOP PF_175
JMP PF_185
PF_180: POP SI
PUSH SI
MOV CX,33
REP MOVSB
PF_185: POP SI
POP DI
POP CX
ADD SI,33
ADD DI,33
LOOP PF_170
LEA DI,WINDOW_6 + 76 ;CLEAR WINDOW 6
MOV CX,4
MOV AL,'_'
PF_190: PUSH CX
MOV CX,33
REP STOSB
POP CX
ADD DI,4
LOOP PF_190
LEA SI,WINDOW_6C ;MAILING ADDRESS INPUT
LEA DI,WINDOW_6+12
MOV CX,15
REP MOVSB
MOV WINDOW_BUMP,86
MOV AL,COLOR_4
MOV WINDOW_COLOR,AL
MOV WINDOW_LINES,9
MOV AX,OFFSET WINDOW_6
MOV WINDOW_NUMBER,AX
MOV WINDOW_START,1654
MOV WINDOW_WIDTH,37
CALL DISPLAY_WINDOW
MOV AL,COLOR_4
MOV CUR_COLOR_1,AL
MOV CUR_COLOR_2,0F2H
LEA SI,BUFFER+132
MOV DI,1978
MOV CX,0
MOV LINE,1
CALL V_TRACE
MOV AL,CUR_COLOR_2
MOV BYTE PTR ES:[DI+1],AL
CALL ENVELOPE
CMP AH,01H
JNE PF_195
JMP PF_265
PF_195: LEA SI,WINDOW_6E
MOV DI,2778
MOV CX,21
CALL V_TRACE
PF_200: MOV AL,BYTE PTR DS:[SI]
MOV BYTE PTR ES:[DI],AL
ADD DI,2
INC SI
LOOP PF_200
PF_205: MOV AH,0
INT 16H
CMP AH,01H ;ESCAPE
JNE PF_210
JMP PF_265
PF_210: CMP AH,3BH ;F1 = STANDARD SIZE
JE PF_215
CMP AH,3CH ;F2 = LEGAL SIZE
JE PF_215
CALL BEEP
JMP PF_205
PF_215: MOV DX,AX ;SAVE SIZE
MOV AL,0DH ;JUMP DOWN FIVE LINES
CALL PRINTER_PORT
MOV CX,5
PF_220: MOV AL,0AH
CALL PRINTER_PORT
LOOP PF_220
LEA SI,BUFFER ;ADDRESS BUFFER
MOV CX,8
PF_225: PUSH CX
CMP CX,4 ;BLANK MIDDLE LINES ?
JNE PF_235
PUSH CX
MOV CX,8
PF_230: MOV AL,0AH
CALL PRINTER_PORT
LOOP PF_230
POP CX
PF_235: CMP CX,4 ;RETURN OR MAILING ?
JA PF_250
CMP DH,3BH ;WHAT SIZE ?
JE PF_240
MOV CX,46 ;LEGAL SIZE INDENT
JMP PF_245
PF_240: MOV CX,25 ;STANDARD SIZE
PF_245: MOV AL,' '
CALL PRINTER_PORT
LOOP PF_245
PF_250: MOV CX,33
PF_255: MOV AL,BYTE PTR DS:[SI] ;PRINT THE LINE
CALL PRINTER_PORT
INC SI
LOOP PF_255
MOV AL,0DH ;MOVE TO NEXT LINE
CALL PRINTER_PORT
MOV AL,0AH
CALL PRINTER_PORT
POP CX
LOOP PF_225
MOV AL,0DH ;PUT CARRIAGE BACK
CALL PRINTER_PORT
MOV CX,10 ;PUSH OUT ENVELOPE
PF_260: MOV AL,0AH
CALL PRINTER_PORT
LOOP PF_260
PF_265: CALL DISPLAY_WIN_1
RET
PAGE_FORMAT ENDP
PRINTER_PORT PROC NEAR
PUSH DX
MOV DX,ACTIVE_PRINTER
OUT DX,AL
INC DX
PRINTER_BUSY: IN AL,DX
TEST AL,80H
JZ PRINTER_BUSY
INC DX
MOV AL,0DH
OUT DX,AL
MOV AL,0CH
OUT DX,AL
POP DX
RET
PRINTER_PORT ENDP
SAVE_FONT PROC NEAR
MOV DI,1174
LEA SI,FONT_CHARACTER
MOV CX,11
SF_005: PUSH CX
PUSH DI
MOV CX,8
MOV BL,10000000B
MOV AL,00H
CALL V_TRACE
SF_010: MOV AH,BYTE PTR ES:[DI]
CMP AH,32
JE SF_015
ADD AL,BL
SF_015: SHR BL,1
ADD DI,160
LOOP SF_010
MOV BYTE PTR DS:[SI],AL
POP DI
POP CX
INC SI
ADD DI,2
LOOP SF_005
RET
SAVE_FONT ENDP
SEND_PRINTER PROC NEAR
MOV AX,SCREEN_ADDRESS
MOV ES,AX
PUSH SI
MOV BX,WORD PTR CS:[SI+3]
CALL V_TRACE
MOV AH,COLOR_2
MOV ES:[BX],AH ;SET HIGHLIGHT
SP_005: MOV AL,CS:[SI]
CALL PRINTER_PORT ;SEND ESC STRING
INC SI
LOOP SP_005
POP SI
ADD SI,5
MOV AH,COLOR_1 ;RESET HIGHLIGHTS
MOV CX,5
SP_010: MOV BX,WORD PTR CS:[SI]
CMP BX,0000
JE SP_015
CALL V_TRACE
MOV ES:[BX],AH
ADD SI,2
LOOP SP_010
SP_015: RET
SEND_PRINTER ENDP
TW_BIN_LINE PROC NEAR ;SHOW LINE NUMBER
PUSH DI
MOV DI,3982
MOV AL,ROW
INC AL
MOV AH,0
MOV DL,10
DIV DL
ADD AL,'0'
CALL V_TRACE
MOV BYTE PTR ES:[DI],AL
SUB AL,'0'
MOV AH,0
MOV DL,10
MUL DL
MOV AH,ROW
INC AH
SUB AH,AL
ADD AH,'0'
MOV BYTE PTR ES:[DI+2],AH
MOV DI,3996
MOV AL,COLUMN
INC AL
MOV AH,0
MOV DL,10
DIV DL
ADD AL,'0'
CALL V_TRACE
MOV BYTE PTR ES:[DI],AL
SUB AL,'0'
MOV AH,0
MOV DL,10
MUL DL
MOV AH,COLUMN
INC AH
SUB AH,AL
ADD AH,'0'
MOV BYTE PTR ES:[DI+2],AH
POP DI
RET
TW_BIN_LINE ENDP
TW_LINES PROC NEAR
LEA SI,TYPEWRITER_BUFF
MOV AL,ROW
MOV AH,0
MOV DL,80
MUL DL
ADD SI,AX
MOV DI,0
MOV AH,0EH ;BLACK/YELLOW
MOV CX,24
TW_005: PUSH CX
CALL V_TRACE
MOV CX,80
TW_010: MOV AL,DS:[SI]
MOV WORD PTR ES:[DI],AX
INC SI
INC DI
INC DI
LOOP TW_010
POP CX
LOOP TW_005
RET
TW_LINES ENDP
TYPEWRITER PROC NEAR
MOV AX,SCREEN_ADDRESS
MOV ES,AX
MOV DI,3840
MOV AH,60H ;YELLOW/BLACK
MOV CX,80
LEA SI,TYPEWRITER_MSG
CALL V_TRACE
TY_005: MOV AL,BYTE PTR DS:[SI]
MOV WORD PTR ES:[DI],AX
INC SI
INC DI
INC DI
LOOP TY_005
MOV ROW,0
MOV COLUMN,0
MOV AH,2
MOV DX,0
MOV BH,0
INT 10H
TY_010: CALL TW_LINES
CALL TW_BIN_LINE
TY_015: MOV AH,0
INT 16H
CMP AH,50H ;DOWN ARROW
JNE TY_020
TY_015X: CMP ROW,65
JE TY_015
MOV AH,3 ;GET CURSOR LOCATION
MOV BH,0
INT 10H
CMP DH,23
JE TY_015A
INC DH ;MOVE CURSOR DOWN
MOV AH,2
INT 10H
INC ROW
CALL TW_BIN_LINE
JMP TY_015
TY_015A: CMP ROW,65
JE TY_015
INC ROW
TY_015B: MOV AL,ROW
PUSH AX
SUB ROW,23
CALL TW_LINES
POP AX
MOV ROW,AL
CALL TW_BIN_LINE
JMP TY_015
TY_020: CMP AH,48H ;UP ARROW
JNE TY_025
CMP ROW,0
JE TY_015
MOV AH,3
MOV BH,0
INT 10H
CMP DH,0
JE TY_020A
TY_020X: DEC DH
MOV AH,2
MOV BH,0
INT 10H
DEC ROW
CALL TW_BIN_LINE
JMP TY_015
TY_020A: DEC ROW
JMP TY_010
TY_025: CMP AH,47H ;HOME
JNE TY_030
MOV ROW,0
MOV COLUMN,0
MOV AH,2
MOV DX,0
MOV BH,0
INT 10H
JMP TY_010
TY_030: CMP AH,4FH ;END
JNE TY_035
MOV ROW,42
MOV COLUMN,0
MOV AH,2
MOV DX,0
MOV BH,0
INT 10H
JMP TY_010
TY_035: CMP AH,49H ;PAGE UP
JNE TY_045
TY_036: MOV AH,2
MOV DX,0
MOV BH,0
INT 10H
MOV COLUMN,0
CMP ROW,24
JB TY_040
SUB ROW,24
JMP TY_010
TY_040: MOV ROW,0
JMP TY_010
TY_045: CMP AH,51H ;PAGE DOWN
JNE TY_060
MOV AH,2
MOV DX,0
MOV BH,0
INT 10H
MOV COLUMN,0
CMP ROW,42
JB TY_050
MOV ROW,42
JMP TY_010
TY_050: ADD ROW,24
CMP ROW,42
JB TY_055
MOV ROW,42
TY_055: JMP TY_010
TY_060: CMP AH,4DH ;RIGHT ARROW
JNE TY_080
TY_060A: MOV AH,3
MOV BH,0
INT 10H
CMP COLUMN,79
JE TY_065
INC DL
MOV AH,2
INT 10H
INC COLUMN
CALL TW_BIN_LINE
JMP TY_015
TY_065: CMP ROW,65
JNE TY_070
JMP TY_015
TY_070: CMP DH,23
JNE TY_075
MOV AH,2
MOV DL,0
MOV BH,0
INT 10H
INC ROW
MOV COLUMN,0
JMP TY_015B
TY_075: MOV DL,0
INC DH
MOV AH,2
INT 10H
INC ROW
MOV COLUMN,0
CALL TW_BIN_LINE
JMP TY_015
TY_080: CMP AH,01H ;ESCAPE
JNE TY_090
JMP TY_900
TY_090: CMP AH,1CH ;CARRIAGE RETURN
JNE TY_095
MOV AH,3
MOV BH,0
INT 10H
MOV DL,0
MOV AH,2
MOV BH,0
INT 10H
MOV COLUMN,0
CALL TW_BIN_LINE
JMP TY_015X
TY_095: CMP AH,4BH ;LEFT ARROW
JE TY_095A
CMP AH,0EH
JE TY_095A
JMP TY_115
TY_095A: MOV AH,3
MOV BH,0
INT 10H
CMP COLUMN,0
JE TY_100
DEC DL
MOV AH,2
INT 10H
DEC COLUMN
CALL TW_BIN_LINE
JMP TY_015
TY_100: CMP ROW,0
JNE TY_105
JMP TY_015
TY_105: MOV DL,79
MOV COLUMN,79
JMP TY_020X
TY_110: MOV DL,0
DEC DH
MOV AH,2
INT 10H
INC ROW
MOV COLUMN,79
CALL TW_BIN_LINE
JMP TY_015
TY_115: CMP AH,53H ;DELETE
JNE TY_118
LEA SI,TYPEWRITER_BUFF
MOV AL,ROW
MOV AH,0
MOV DL,80
MUL DL
ADD SI,AX
PUSH SI
MOV AL,COLUMN
MOV AH,0
ADD SI,AX
MOV CL,79
SUB CL,COLUMN
MOV CH,0
CMP CX,0
JE TY_116A
TY_116: MOV AL,BYTE PTR DS:[SI+1]
MOV BYTE PTR DS:[SI],AL
INC SI
LOOP TY_116
TY_116A: MOV BYTE PTR DS:[SI],' '
POP SI
MOV AH,3
MOV BH,0
INT 10H
MOV AL,DH
MOV AH,0
MOV DL,160
MUL DL
MOV DI,AX
MOV CX,80
MOV AH,0EH
CALL V_TRACE
TY_117: MOV AL,BYTE PTR DS:[SI]
MOV BYTE PTR ES:[DI],AL
INC SI
INC DI
INC DI
LOOP TY_117
JMP TY_015
TY_118: CMP AH,52H ;INSERT
JNE TY_119
CMP INSERT,' '
JE TY_118A
MOV INSERT,' '
CALL V_TRACE
MOV BYTE PTR ES:[3962],' '
MOV BYTE PTR ES:[3964],' '
MOV BYTE PTR ES:[3966],' '
JMP TY_015
TY_118A: MOV INSERT,'I'
MOV AL,INSERT
CALL V_TRACE
MOV BYTE PTR ES:[3962],'I'
MOV BYTE PTR ES:[3964],'N'
MOV BYTE PTR ES:[3966],'S'
JMP TY_015
TY_119: CMP AH,3CH ;F2 - CLEAR
JNE TY_119A
MOV CX,2640
MOV AX,2020H
LEA SI,TYPEWRITER_BUFF
TY_119X: MOV WORD PTR DS:[SI],AX
INC SI
INC SI
LOOP TY_119X
JMP TY_036
TY_119A: CMP AH,3BH
JNE TY_119B
LEA SI,TYPEWRITER_BUFF
MOV CX,66
TY_119C: PUSH CX
MOV CX,80
TY_119D: MOV AL,BYTE PTR DS:[SI]
CALL PRINTER_PORT
INC SI
LOOP TY_119D
MOV AL,0DH
CALL PRINTER_PORT
MOV AL,0AH
CALL PRINTER_PORT
POP CX
LOOP TY_119C
JMP TY_015
TY_119B: CMP AL,0
JNE TY_120
CALL BEEP ;UNKNOWN REQUEST
JMP TY_015
TY_120: CMP INSERT,'I'
JE TY_125
PUSH AX ;DISPLAY CHARACTER
MOV AH,3
MOV BH,0
INT 10H
PUSH DX
MOV AL,DH
MOV AH,0
MOV DL,160
MUL DL
POP DX
PUSH AX
MOV AL,DL
MOV AH,0
MOV DL,2
MUL DL
POP DI
ADD DI,AX
POP AX
CALL V_TRACE
MOV BYTE PTR ES:[DI],AL
PUSH AX
LEA SI,TYPEWRITER_BUFF
MOV AL,ROW
MOV AH,0
MOV DL,80
MUL DL
ADD SI,AX
MOV AL,COLUMN
MOV AH,0
ADD SI,AX
POP AX
MOV BYTE PTR DS:[SI],AL
JMP TY_060A
TY_125: CMP COLUMN,79
JB TY_126
CALL BEEP
JMP TY_015
TY_126: PUSH AX
LEA SI,TYPEWRITER_BUFF
MOV AL,ROW
MOV AH,0
MOV DL,80
MUL DL
ADD SI,AX
ADD SI,79
MOV CX,80
SUB CL,COLUMN
DEC CX
TY_130: MOV AL,BYTE PTR DS:[SI-1]
MOV BYTE PTR DS:[SI],AL
DEC SI
LOOP TY_130
POP AX
MOV BYTE PTR DS:[SI],AL
LEA SI,TYPEWRITER_BUFF
MOV AL,ROW
MOV AH,0
MOV DL,80
MUL DL
ADD SI,AX
MOV AH,3
MOV BH,0
INT 10H
MOV AL,DH
MOV AH,0
MOV DL,160
MUL DL
MOV DI,AX
MOV CX,80
MOV AH,0EH
CALL V_TRACE
TY_135: MOV AL,BYTE PTR DS:[SI]
MOV BYTE PTR ES:[DI],AL
INC SI
INC DI
INC DI
LOOP TY_135
JMP TY_060A
TY_900: CALL DISPLAY_WIN_1
MOV AH,2
MOV DX,0
MOV BH,0
INT 10H
RET
TYPEWRITER ENDP
V_TRACE PROC NEAR
CMP MONO,'Y' ;HANDLE C/G ADAPTER
JE VT_010 ;SNOW
PUSH DX
PUSH AX
MOV DX,3DAH
VT_005: IN AX,DX
AND AX,8
JZ VT_005
POP AX
POP DX
VT_010: RET
V_TRACE ENDP
PROGRAM_END LABEL BYTE
ADDRESS_LOC DW 0
ALREADY_MSG DB 0DH,0AH,'PRO-SET ALREADY INSTALLED',0DH,0AH,'$'
INSTALL_MSG DB 0DH,0AH,'PRO-SET 3.5 INSTALLED',0DH,0AH,'$'
NO_PARM_MSG DB 0DH,0AH,'╔════════════════════════════════════════╗'
DB 0DH,0AH,'║ ACTIVATE PRO-SET 3.5 AS FOLLOWS: ║'
DB 0DH,0AH,'║ PRO-SET [R=x C=x V=x S=xx K=xx A=xxx] ║'
DB 0DH,0AH,'║----------------------------------------║'
DB 0DH,0AH,'║ R indicates Run Type: ║'
DB 0DH,0AH,'║ x = "R" for Resident, "B" for Batch ║'
DB 0DH,0AH,'║ C indicates Colors Wanted: ║'
DB 0DH,0AH,'║ x = "C" for Color, "M" for Mono ║'
DB 0DH,0AH,'║ V indicates Sound Wanted: ║'
DB 0DH,0AH,'║ x = "Y" for Yes "N" for No ║'
DB 0DH,0AH,'║ S indicates scan code of Hot-Key: ║'
DB 0DH,0AH,'║ xx = hexidecimal scan code ║'
DB 0DH,0AH,'║ K indicates the Shift/CTRL/ALT keys: ║'
DB 0DH,0AH,'║ xx = hexidecimal value of key combo ║'
DB 0DH,0AH,'║ A indicates the Return Address DSN ║'
DB 0DH,0AH,'║ xxx = [Drive]:\[Path]\[Dataset Name] ║'
DB 0DH,0AH,'║----------------------------------------║'
DB 0DH,0AH,'║=> Defaults are R=R C=C V=Y S=19 K=0C <=║'
DB 0DH,0AH,'╚════════════════════════════════════════╝'
DB 0DH,0AH,0AH,'$'
PARMS DB 'S=K=V=C=R=A='
HEX_BIN PROC NEAR
MOV DL,BYTE PTR DS:[SI+2] ;CONVERT EXTERNAL HEX
CMP DL,'0' ;TO INTERNAL BINARY
JL HB_025
CMP DL,'F'
JA HB_025
CMP DL,':'
JL HB_005
CMP DL,'A'
JL HB_025
SUB DL,07H
HB_005: SUB DL,30H
CMP DL,'9'
JLE HB_010
DEC DL
HB_010: MOV AL,DL
MOV DL,10H
MUL DL
MOV DL,BYTE PTR DS:[SI+3]
CMP DL,'0'
JL HB_025
CMP DL,'F'
JA HB_025
CMP DL,':'
JL HB_015
CMP DL,'A'
JL HB_025
SUB DL,07H
HB_015: SUB DL,30H
CMP DL,'9'
JLE HB_020
DEC DL
HB_020: MOV DH,0
ADD AX,DX
JMP HB_030
HB_025: MOV AX,0FFFFH
HB_030: RET
HEX_BIN ENDP
CHECK_CAPS PROC NEAR
CMP AL,'a'
JB CC_005
CMP AL,'z'
JA CC_005
SUB AL,' '
CC_005: RET
CHECK_CAPS ENDP
START: MOV AX,CS ;LOCATE PARMS, IF ANY
MOV DS,AX
MOV SI,80H
MOV CH,0
MOV CL,BYTE PTR DS:[SI]
INC SI
CMP CX,0
JNE FIND_PARMS
MOV COLOR_REQUEST,'C' ;SET DEFAULTS
MOV SOUND_STATUS,'Y'
MOV KBFLAG,0CH
MOV SCAN_CODE,19H
MOV RESIDENT,'R'
JMP MAKE_RESIDENT
PARM_ERROR: PUSH DS ;SET UP NORMAL RETURN
MOV AX,0 ;STACK
PUSH AX
PUSH CS ;TELL USER HE DID IT
POP DS ;WRONG
LEA DX,NO_PARM_MSG
MOV AH,09H
INT 21H
CALL BEEP
RET
FIND_PARMS: MOV SI,81H
MOV CH,0
MOV CL,BYTE PTR DS:[80H]
PUSH CX
PUSH SI
CAPS_LOOP: MOV AL,DS:[SI]
CALL CHECK_CAPS
MOV DS:[SI],AL
INC SI
LOOP CAPS_LOOP
POP SI
POP CX
FIND_RESIDENT: PUSH CX
PUSH SI
LEA DI,PARMS+8
MOV CX,2
REPZ CMPSB
JE GOT_RESIDENT
POP SI
POP CX
INC SI
LOOP FIND_RESIDENT
JMP FIND_COLOR
GOT_RESIDENT: POP SI
POP CX
MOV RESIDENT,'B'
CMP BYTE PTR DS:[SI+2],'B'
JE FIND_COLOR
MOV RESIDENT,'R'
CMP BYTE PTR DS:[SI+2],'R'
JE FIND_COLOR
JMP PARM_ERROR
FIND_COLOR: MOV SI,81H
MOV CH,0
MOV CL,BYTE PTR DS:[80H]
FIND_COLOR_2: PUSH CX
PUSH SI
LEA DI,PARMS+6
MOV CX,2
REPZ CMPSB
JE GOT_COLOR
POP SI
POP CX
INC SI
LOOP FIND_COLOR_2
JMP FIND_SOUND
GOT_COLOR: POP SI
POP CX
MOV COLOR_REQUEST,'M'
CMP BYTE PTR DS:[SI+2],'M'
JE FIND_SOUND
MOV COLOR_REQUEST,'C'
CMP BYTE PTR DS:[SI+2],'C'
JE FIND_SOUND
JMP PARM_ERROR
FIND_SOUND: MOV SI,81H
MOV CH,0
MOV CL,BYTE PTR DS:[80H]
FIND_SOUND_2: PUSH CX
PUSH SI
LEA DI,PARMS+4
MOV CX,2
REPZ CMPSB
JE GOT_SOUND
POP SI
POP CX
INC SI
LOOP FIND_SOUND_2
JMP FIND_SCAN
GOT_SOUND: POP SI
POP CX
MOV SOUND_STATUS,'N'
CMP BYTE PTR DS:[SI+2],'N'
JE FIND_SCAN
MOV SOUND_STATUS,'Y'
CMP BYTE PTR DS:[SI+2],'Y'
JE FIND_SCAN
JMP PARM_ERROR
FIND_SCAN: MOV SI,81H
MOV CH,0
MOV CL,BYTE PTR DS:[80H]
FIND_SCAN_2: PUSH CX
PUSH SI
LEA DI,PARMS+2
MOV CX,2
REPZ CMPSB
JE GOT_SCAN
POP SI
POP CX
INC SI
LOOP FIND_SCAN_2
JMP FIND_KBFLAG
GOT_SCAN: POP SI
POP CX
CALL HEX_BIN
CMP AX,0FFFFH
JNE SCAN_OKAY
JMP PARM_ERROR
SCAN_OKAY: MOV SCAN_CODE,AL
FIND_KBFLAG: MOV SI,81H
MOV CH,0
MOV CL,BYTE PTR DS:[80H]
FIND_KBFLAG_2: PUSH CX
PUSH SI
LEA DI,PARMS
MOV CX,2
REPZ CMPSB
JE GOT_KBFLAG
POP SI
POP CX
INC SI
LOOP FIND_KBFLAG_2
JMP FIND_ADDRESS
GOT_KBFLAG: POP SI
POP CX
CALL HEX_BIN
CMP AX,0FFFFH
JNE KBFLAG_OKAY
JMP PARM_ERROR
KBFLAG_OKAY: MOV KBFLAG,AL
FIND_ADDRESS: MOV SI,81H
MOV CH,0
MOV CL,BYTE PTR DS:[80H]
FIND_ADDRESS_2: PUSH CX
PUSH SI
LEA DI,PARMS+10
MOV CX,2
REPZ CMPSB
JE GOT_ADDRESS
POP SI
POP CX
INC SI
LOOP FIND_ADDRESS_2
JMP PARMS_SET
GOT_ADDRESS: POP SI
POP CX
MOV BX,OFFSET ASCIIZ
ADD SI,2
GA_005: MOV AL,DS:[SI]
CMP AL,' '
JE GA_010
CMP AL,00H
JE GA_010
CMP AL,0DH
JE GA_010
MOV BYTE PTR DS:[BX],AL
INC BX
INC SI
JMP GA_005
GA_010: MOV AL,00H
MOV BYTE PTR DS:[BX],AL
MOV AH,3DH ;OPEN ADDRESS FILE
MOV AL,00H
LEA DX,ASCIIZ
INT 21H
CMP AX,2
JE GA_035
CMP AX,4
JE GA_035
CMP AX,12
JE GA_035
MOV DI,0
MOV LINE,1
MOV BX,AX
LEA DX,RETURN_ADDRESS
MOV ADDRESS_LOC,DX
GA_015: MOV CX,1 ;READ A BYTE
MOV AH,3FH
INT 21H
CMP AX,0
JE GA_030
CMP DI,132
JA GA_030
MOV SI,DX
CMP BYTE PTR DS:[SI],0DH ;CARRIAGE RETURN
JE GA_020
CMP BYTE PTR DS:[SI],0AH ;LINE FEED
JE GA_025
INC DX
INC DI
JMP GA_015
GA_020: MOV BYTE PTR DS:[SI],5FH ;BLANK CARRIAGE RETURN
ADD ADDRESS_LOC,33
MOV DX,ADDRESS_LOC
INC LINE
CMP LINE,5
JE GA_030
JMP GA_015
GA_025: MOV BYTE PTR DS:[SI],5FH ;BLANK LINE FEED
JMP GA_015
GA_030: MOV AH,3EH ;CLOSE FILE
INT 21H
JMP PARMS_SET
GA_035: JMP PARM_ERROR
PARMS_SET: CMP COLOR_REQUEST,'C'
JE CHECK_RUN_TYPE
MOV COLOR_1,07H ;SET TO MONOCHROME
MOV COLOR_2,0FH
MOV COLOR_3,07H
MOV COLOR_4,0FH
MOV COLOR_5,07H
MOV COLOR_6,0FH
MOV COLOR_7,07H
MOV COLOR_8,0FH
CHECK_RUN_TYPE: CMP RESIDENT,'R' ;MAKE RESIDENT
JE MAKE_RESIDENT
BATCH_RUN: PUSH DS
MOV AX,0
PUSH AX
JMP KBOARD_MATCH
MAKE_RESIDENT: PUSH CS ;PROGRAM LOADER
POP DS
LEA SI,LOAD_FLAG ;SET FLAGS TO SEE IF
MOV BYTE PTR DS:[SI],'╗' ;LOADED BEFORE
MOV BYTE PTR DS:[SI+1],'╝'
MOV BYTE PTR DS:[SI+2],'╜'
MOV AX,0
CHECK_LOADED: MOV ES,AX ;LOADED BEFORE ?
LEA SI,LOAD_FLAG
MOV DI,SI
MOV CX,3
REP CMPSB
JE CHECK_EQUAL
INC AX
JMP SHORT CHECK_LOADED
CHECK_EQUAL: MOV AX,ES ;IF ES AND DS SAME
MOV BX,DS ;THEN NOT LOADED
CMP AX,BX
JE LOAD_IT
LEA DX,ALREADY_MSG ;ALREADY RESIDENT
MOV AH,09H
INT 21H
CALL BEEP
RET
LOAD_IT: LEA DX,INSTALL_MSG ;INSTALLATION MESSAGE
MOV AH,09H
INT 21H
MOV AX,3509H ;GET OLD VECTOR ADDR
INT 21H
MOV WORD PTR CS:[KBOARD_VECTOR],BX
MOV WORD PTR CS:[KBOARD_VECTOR+2],ES
LEA DX,KBOARD_HANDLER ;SET NEW VECTOR
MOV AX,2509H
INT 21H
MOV DX,OFFSET PROGRAM_END+1 ;LOAD & STAY
INT 27H
CODE ENDS
END PROSET